package org.jeecg.modules.zhoupackage.controller;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.zhoupackage.pojo.*;
import org.jeecg.modules.zhoupackage.pojo.myexcel.SingOrderExcel;
import org.jeecg.modules.zhoupackage.pojo.myexcel.TeamOrderExcel;
import org.jeecg.modules.zhoupackage.service.IOrderService;
import org.jeecg.modules.zhoupackage.util.UpdateUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 面料订单Controller
 *
 * @author zxl
 * @since 20200923
 */
@SuppressWarnings("all")
@RestController
@RequestMapping("/Order")
public class OrderController {

    @Autowired
    IOrderService service;

    /**
     * 创建未支付的面料订单
     *
     * @param token 令牌
     * @param order 订单类
     */
    @RequestMapping("/createFabricOrder")
    public JSONObject createFabricOrder(String token, MlccFabricOrderinfo order) {
        JSONObject jsonObject = new JSONObject();
        try {
            String result = service.createFabricOrder(token, order);
            if ("-1".equals(result)) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "token无效");
            } else if ("0".equals(result)) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "创建订单失败");
            } else if ("-6".equals(result)) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "购物车已被清空");
            } else {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "创建订单成功");
                jsonObject.put("data", result);
            }
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "创建订单失败");
        }
        return jsonObject;
    }

    /**
     * 查看当前用户订单列表
     *
     * @param token     令牌
     * @param orderType 订单类型 3面料 0个订 1团订
     * @param pageNo    当前页
     * @param pageSize  页面大小
     */
    @RequestMapping("/getOrderList")
    public JSONObject getOrderList(String token, int orderType, @RequestParam(name = "pageNo", defaultValue = "1") int pageNo,
                                   @RequestParam(name = "pageSize", defaultValue = "10") int pageSize,
                                   @RequestParam(name = "time", required = false) String time,
                                   @RequestParam(name = "endtime", required = false) String endtime,
                                   @RequestParam(name = "status", required = false) Integer status,
                                   @RequestParam(name = "code", required = false) String code,
                                   @RequestParam(name = "fabricCode", required = false) String fabricCode,
                                   @RequestParam(name = "emp", required = false) String emp,
                                   @RequestParam(name = "cusname", required = false) String cusname,
                                   @RequestParam(name = "companyName", required = false) String companyName) {
        /*System.out.println("订单类型：" + orderType);*/
        if (endtime != null && !"".equals(endtime)) {
            endtime = endtime + " 23:59:59";
        }
        return service.getOrderList(pageNo, pageSize, token, orderType, time, endtime, status, code, fabricCode, emp, cusname, companyName);
    }

    /**
     * 根据订单id获取面料订单详情
     *
     * @param token
     * @param fabricOrderId
     * @return
     */
    @RequestMapping("/getFabricOrderDetail")
    public JSONObject getOrderDetail(String token, int fabricOrderId) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<CartEntity> orderDetail = service.getFabricOrderList(token, fabricOrderId);
            if (orderDetail == null) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "查询失败");
                return jsonObject;
            }
            jsonObject.put("code", 0);
            jsonObject.put("msg", "查询成功");
            jsonObject.put("data", orderDetail);
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "查询失败");
            return jsonObject;
        }
    }

    /**
     * 面料订单售后
     *
     * @param token      令牌
     * @param orderSn    订单编号
     * @param number     快递单号
     * @param reason     售后原因
     * @param salaryType 售后类型
     * @return 返回值
     */
    @RequestMapping("/fabricAfterSales")
    public JSONObject AfterSales(String token, String orderSn, String number, String reason, int salaryType) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.fabricAfterSales(token, orderSn, number, reason, salaryType);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "提交成功");
                return jsonObject;
            }
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        }
    }

    /**
     * 获取售后订单列表
     *
     * @param token
     * @param orderType
     * @param pageNo
     * @param pageSize
     * @param startTime
     * @param endTime
     * @param status
     * @param code
     * @return
     */
    @RequestMapping("/getAfterSalesList")
    public JSONObject getAfterSalesList(String token, int orderType, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                        @DateTimeFormat(pattern = "yyyy-MM-ss") Date startTime,
                                        @DateTimeFormat(pattern = "yyyy-MM-ss") Date endTime,
                                        @RequestParam(name = "status", required = false) Integer status,
                                        @RequestParam(name = "code", required = false) String code) {
        return service.getAfterSalesList(pageNo, pageSize, token, orderType, startTime, endTime, status, code);
    }

    /**
     * 我的订单界面导出订单Excel (个订导出)
     *
     * @param token     用户Token
     * @param orderType 订单类型
     * @return
     */
    @RequestMapping("/getOrderExcel")
    public ModelAndView getOrderExcel(String token) {
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 导出文件名称
        mv.addObject(NormalExcelConstants.FILE_NAME, "个定订单列表");
        // 注解对象Class
        mv.addObject(NormalExcelConstants.CLASS, SingOrderExcel.class);
        // 自定义表格参数
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("个定订单列表", "个定订单列表"));
        // 导出数据列表
        mv.addObject(NormalExcelConstants.DATA_LIST, service.getOrderExcel(token));
        return mv;
    }

    /**
     * 面料订单导出Excel
     *
     * @param token 令牌
     * @return Excel文件
     */
    @RequestMapping("/getFabricOrderExcel")
    public ModelAndView getFabricOrderExcel(String token) {
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 导出文件名称
        mv.addObject(NormalExcelConstants.FILE_NAME, "面料订单列表");
        // 注解对象Class
        mv.addObject(NormalExcelConstants.CLASS, MyFabricOrderExcel.class);
        // 自定义表格参数
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("面料订单列表", "面料订单列表"));
        // 导出数据列表
        mv.addObject(NormalExcelConstants.DATA_LIST, service.getFabricOrderExcel(token));
        return mv;
    }

    /**
     * 导出团订列表Excel
     *
     * @param token
     */
    @RequestMapping("/getTeamOrderExcel")
    public ModelAndView getTeamOrderExcel(String token) {
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 导出文件名称
        mv.addObject(NormalExcelConstants.FILE_NAME, "团体订单列表");
        // 注解对象Class
        mv.addObject(NormalExcelConstants.CLASS, TeamOrderExcel.class);
        // 自定义表格参数
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("团体订单列表", "团体订单列表"));
        // 导出数据列表
        mv.addObject(NormalExcelConstants.DATA_LIST, service.getTeamOrderExcel(token));
        return mv;
    }

    /**
     * 我的订单——个订售后
     *
     * @param token      令牌
     * @param orderSn    订单编号
     * @param salaryType 售后类型
     * @param reason     售后原因
     * @param number     运单号
     * @return 返回结果
     */
    @RequestMapping("/SingleOrderAfter")
    public JSONObject SingleOrderAfter(String token, String orderSn, int salaryType, String reason, String number) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.SingleOrderAfter(token, orderSn, salaryType, reason, number);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "提交成功");
                return jsonObject;
            }
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        }
    }

    /**
     * 我的订单——团订售后
     *
     * @param token      令牌
     * @param orderSn    订单编号
     * @param salaryType 售后类型
     * @param reason     售后原因
     * @param number     运单号
     * @return 返回结果
     */
    @RequestMapping("/teamOrderAfter")
    public JSONObject teamOrderAfter(String token, String orderSn, int salaryType, String reason, String number) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.teamOrderAfter(token, orderSn, salaryType, reason, number);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "提交成功");
                return jsonObject;
            }
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
            return jsonObject;
        }
    }

    /**
     * 个订返修更新产品尺寸
     *
     * @param token     令牌
     * @param productID 产品ID
     * @param sizeID    尺寸ID
     * @param sizeValue 具体的值
     * @return 修改的结果
     */
    @RequestMapping("/updateProductSize")
    public JSONObject updateProductSize(String token, String productID, String sizeID, String sizeValue) {
        JSONObject json = new JSONObject();
        try {
            int retult = service.updateProductSize(token, productID, sizeID, sizeValue);
            json = UpdateUtil.analysisResult(retult);
        } catch (Exception e) {
            e.printStackTrace();
            json.put("code", 1);
            json.put("msg", "操作失败");
        }
        return json;
    }


    /**
     * 个订——返修界面提交
     *
     * @param afterCode 售后订单编号
     * @param token     令牌
     * @param orderSn   订单编号
     * @param reason    售后原因
     * @param imgURL    售后图片
     * @param money     售后金额
     * @param pid       产品id
     */
    @RequestMapping("/updateSingleOrder")
    public JSONObject updateSingleOrder(String afterCode, String token, String orderSn, String reason, String imgURL, String money, String pid) {
        JSONObject json = new JSONObject();
        try {
            int retult = service.updateSingleOrder(afterCode, token, orderSn, reason, imgURL, money, pid);
            json = UpdateUtil.analysisResult(retult);
        } catch (Exception e) {
            e.printStackTrace();
            json.put("code", 1);
            json.put("msg", "操作失败");
        }
        return json;
    }

    /**
     * 团订返修界面的查询员工
     *
     * @param token      令牌
     * @param codeOrName 员工名称或者编码
     * @param customerId 订单里的客户ID
     * @return
     */
    @RequestMapping("/selectEmployees")
    public JSONObject selectEmployees(String token, String codeOrName, String customerId) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<MlccCustomerInfo> mlccCustomerInfos = service.selectEmployees(token, codeOrName, customerId);
            jsonObject.put("code", 0);
            jsonObject.put("data", mlccCustomerInfos);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("data", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 团订返修界面获取团订基本信息
     *
     * @param token   令牌
     * @param orderSn 团订订单号
     * @return
     */
    @RequestMapping("/getTeamOrderDetail")
    public JSONObject getTeamOrderDetail(String token, String orderSn) {
        JSONObject jsonObject = new JSONObject();
        try {
            MlccTeamOrderInfo teamOrderDetail = service.getTeamOrderDetail(token, orderSn);
            jsonObject.put("code", 0);
            jsonObject.put("data", teamOrderDetail);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("data", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 团订返修界面获取部门下产品列表
     *
     * @param token
     * @param departid
     * @param orderSn
     * @return
     */
    @RequestMapping("/getProductList")
    public JSONObject getProductList(String token, String departid, String orderSn) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<MlccProductInfo> teamOrderDetail = service.getProductList(token, departid, orderSn);
            jsonObject.put("code", 0);
            jsonObject.put("data", teamOrderDetail);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("data", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 根据选中的产品获取尺寸列表
     *
     * @param token
     * @param productID
     * @return
     */
    @RequestMapping("/getSizeList")
    public JSONObject getSizeList(String token, String productID) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<MlccProductBodysize> sizeList = service.getSizeList(token, productID);
            jsonObject.put("code", 0);
            jsonObject.put("data", sizeList);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("data", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 我的订单未支付订单的取消订单
     *
     * @param token     令牌
     * @param orderType 订单类型 3面料  0个订订单  1团订订单
     * @param orderSn   订单编号
     */
    @RequestMapping("/delOrder")
    public JSONObject delOrder(String token, Integer orderType, String orderSn) {
        JSONObject object = new JSONObject();
        try {
            int result = service.delOrder(token, orderType, orderSn);
            if (result > 0) {
                object.put("code", 0);
                object.put("msg", "取消订单成功");
            } else {
                object.put("code", 1);
                object.put("msg", "取消订单失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            object.put("code", 1);
            object.put("msg", "取消订单失败");
        }
        return object;
    }

    /**
     * 订单状态跟踪(前端)
     *
     * @param token
     * @param orderSn
     * @return
     */
    @RequestMapping("/getFabricOrderTracking")
    public JSONObject getFabricOrderTracking(String token, String orderSn, Integer orderType) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<MlccTrackingOrder> tracking = service.getFabricOrderTracking(token, orderSn, orderType);
            jsonObject.put("code", 0);
            jsonObject.put("msg", "查询成功");
            jsonObject.put("data", tracking);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 我的订单，订单详情的立即支付
     *
     * @param token     令牌
     * @param orderType 订单类型，0个订，1团订，3面料
     * @param orderSn   订单编号
     * @return
     */
    @RequestMapping("/buyNow")
    public JSONObject buyNow(String token, Integer orderType, String orderSn, String remark) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.buyNow(token, orderType, orderSn, remark);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "支付成功");
            } else if (result == -1) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "token无效");
            } else if (result == -2) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "余额不足");
            } else if (result == -3) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "该订单不存在或已支付");
            } else {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "支付失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", e.getMessage());
        }
        return jsonObject;
    }

    /**
     * web端我的订单——面料订单申请售后
     *
     * @param token     令牌
     * @param orderSn   订单号
     * @param remark    申请售后原因
     * @param afterType 售后类型 0退货，1换货
     * @param img       上传的图片连接
     * @param cart      （购物车id）
     * @return 结果
     */
    @RequestMapping("/applicationAafter")
    public JSONObject applicationAafter(String token, String orderSn, String remark, Integer afterType, String img, String cart) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.applicationAafter(token, orderSn, remark, afterType, img, cart);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "提交成功");
            } else if (result == -1) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "token无效");
            } else if (result == -7) {
                jsonObject.put("code", -7);
                jsonObject.put("msg", "此产品已经退款");
            } else if (result == -6) {
                jsonObject.put("code", -6);
                jsonObject.put("msg", "此产品已经提交售后，请勿重复提交");
            } else {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "提交失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "提交失败");
        }
        return jsonObject;
    }

    /**
     * 个订取产品状态跟踪列表
     *
     * @param token   令牌
     * @param orderSn 订单编号
     * @return
     */
    @RequestMapping("/listtrackingProduct")
    public JSONObject listtrackingProduct(String token, String orderSn) {
        JSONObject jsonObject = new JSONObject();
        try {
            List<MlccTrackingProduct> list = service.listtrackingProduct(token, orderSn);
            jsonObject.put("code", 0);
            jsonObject.put("data", list);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "发生异常");
        }
        return jsonObject;
    }

    /**
     * 根据产品ID获取可以返修的身体数据
     *
     * @param token     令牌
     * @param priductID 产品ID
     * @return
     */
    @RequestMapping("/listProductBodySize")
    public JSONObject listProductBodySize(String token, String priductID) {
        JSONObject jsonObject = new JSONObject();
        try {
            Set<MlccCategoryFanxiuInfo> infoSet = service.listProductBodySize(token, priductID);
            jsonObject.put("code", 0);
            jsonObject.put("data", infoSet);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 个订产品返修
     *
     * @param token     令牌
     * @param productID 产品ID
     * @param sizeID    尺寸ID
     * @param sizeValue 尺寸值
     * @return
     */
    @RequestMapping("/saveFanxiuSize")
    public JSONObject saveFanxiuSize(String afterCode, String token, String productID, String sizeID, String sizeValue, String sizeTitle, String orderSn) {
        JSONObject jsonObject = new JSONObject();
        try {
            int result = service.saveFanxiuSize(afterCode, token, productID, sizeID, sizeValue, sizeTitle, orderSn);
            if (result > 0) {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "修改成功");
            } else {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "修改失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "修改失败");
        }
        return jsonObject;
    }

    /**
     * 订单售后记录跟踪
     *
     * @param token     令牌
     * @param orderSn   订单编号
     * @param orderType 订单类型
     * @return 售后记录列表
     */
    @RequestMapping("/listTeamAfter")
    public JSONObject listTeamAfter(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, String token, String orderSn, Integer orderType) {
        Page<MlccAfterSalesinfo> page = new Page<>(pageNo, pageSize);
        JSONObject jsonObject = new JSONObject();
        try {
            IPage<MlccAfterSalesinfo> iPage = service.listTeamAfter(page, token, orderSn, orderType);
            jsonObject.put("code", 0);
            jsonObject.put("data", iPage);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "查询失败");
        }
        return jsonObject;
    }

    /**
     * 创建一条个订售后订单
     *
     * @param orderSn 个订订单编号
     */
    @RequestMapping("/createSingleAfterOrder")
    public JSONObject createSingleAfterOrder(String orderSn, String token) {
        JSONObject jsonObject = new JSONObject();
        try {
            String afterOrder = service.createSingleAfterOrder(orderSn, token);
            if (afterOrder == null) {
                jsonObject.put("code", 1);
                jsonObject.put("msg", "创建失败");
            } else {
                jsonObject.put("code", 0);
                jsonObject.put("msg", "创建成功");
                jsonObject.put("data", afterOrder);
            }
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "创建失败");
        }
        return jsonObject;
    }

    /**
     * 查询个订订单本次返修的价格
     *
     * @param afterCode 售后订单编号
     * @param orderSn   个订顶订单编号
     * @param pid       产品id
     */
    @RequestMapping("/selectSingleFanxiuPrice")
    public JSONObject selectSingleFanxiuPrice(String afterCode, String orderSn, String pid) {
        JSONObject jsonObject = new JSONObject();
        try {
            double afterOrder = service.selectSingleFanxiuPrice(afterCode, orderSn, pid);
            jsonObject.put("code", 0);
            jsonObject.put("price", afterOrder);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObject.put("code", 1);
            jsonObject.put("msg", "创建失败");
        }
        return jsonObject;
    }
}
